package com.jamie.jvm.lock;

/**
 * 可重入锁(也叫递归锁)
 * 指的是同一线程外层函数获得锁之后，内层递归函数仍然能获取该锁的代码，
 * 在同一线程在外层方法获得锁的时候，在进入内存方法会自动获得锁
 *
 * 也即是说，线程可以进入任何一个它已经拥有的锁所同步的代码块。
 * @author Jmaie
 */
public class ReentrantLockDemo1 {
    /**
     * 验证 ReentrantLock就是一个典型的可重入锁
     */
    public static void main(String[] args) {
        Phone1 phone = new Phone1();
        new Thread(phone::sendSMS, "t2").start();
        //        t1	 invoked sendSMS()         t1线程在外层方法获取锁的时候
        //        t1	 ##### invoked sendEmail() t1在进入内层方法会自动获取锁
        new Thread(phone::sendSMS, "t2").start();
        //        t2	 invoked sendSMS()
        //        t2	 ##### invoked sendEmail()
    }

}

class Phone1 {

    public synchronized void sendSMS() {
        System.out.println(Thread.currentThread().getName() + "\t invoked sendSMS()");
        sendEmail();
    }

    public synchronized void sendEmail() {
        System.out.println(Thread.currentThread().getName() + "\t ##### invoked sendEmail()");
    }

}